﻿#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QGraphicsScene>
#include "CImgEnhance.h"
#include "MyComBox.h"
#include <opencv2/opencv.hpp>
// using namespace cv;  注意 SIMD和OpenCV有命名空间的冲突 要使用cv::Mat 的方式来访问OpenCv

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    /**
     * @brief Mat -> QPixMap 显示到QGraphicsView的QGraphicsScene
     * @param mat
     * @param view
     * @param scene
     */
    void showMatInGraphicsView(cv::Mat& mat, QGraphicsView* view, QGraphicsScene* scene);

    /**
     * @brief UI中调用幂变换，增强图像
     */
    void uiEnhcPowerTransform();

    /**
     * @brief UI中调用反变换，增强图像
     */
    void uiEnhcRevseTransform();

    /**
     * @brief UI中调用直方图均衡化，增强图像
     */
    void uiEnhcHistEqualization();

    /**
     * @brief UI中调用对数变换，增强图像
     */
    void uiEnhcLogTransform();

signals:
    // 显示处理结果
    void sgl_showProcRet();

private slots:
    /**
     * @brief 读取原图
     */
    void on_btnReadOrgImg_clicked();

    /**
     * @brief 选择图片，获取图片路径
     */
    void on_toolBtnGetPath_clicked();

    /**
     * @brief 图像显示：显示原图
     */
    void on_btnShowSrc_clicked();

    /**
     * @brief 图像显示：显示灰度图
     */
    void on_btnShowGray_clicked();

    /**
     * @brief 图像显示：显示处理结果
     */
    void on_btnShowDst_clicked();

    /**
     * @brief 图像处理方式：图像增强
     */
    void on_btnEnhance_clicked();

    /**
     * @brief 图像处理方式：空间滤波
     */
    void on_btnSpacFilt_clicked();

    /**
     * @brief 根据 图像增强的 comboBox 的索引，选择功能，对图像进行处理
     * @param index
     */
    void on_comboBox_enhance_activated(int index);

    /**
     * @brief 调节参数C，显示幂变换处理的图像
     * @param arg1
     */
    void on_douSpinBox_enhC_valueChanged(double arg1);

    /**
     * @brief 调节参数G，显示幂变换处理的图像
     * @param arg1
     */
    void on_douSpinBox_enhG_valueChanged(double arg1);

    /**
     * @brief 调节参数C，显示对数变换处理的图像
     * @param arg1
     */
    void on_doubleBox_enhLog_valueChanged(double arg1);

private:
    Ui::Widget *ui;
    QGraphicsScene *scene_srcImg;       // qt中显示的原图
    QGraphicsScene *scene_grayImg;      // qt中显示的灰度图
    QGraphicsScene *scene_dstImg;       // qt中显示的处理结果图

    QString srcImgPath;                 // 原图的路径
    cv::Mat mGrayImg;                   // 用于处理的灰度图
    cv::Mat mDstImg;                    // 处理后的图像
    cv::Mat mSrcImg;

    CImgEnhance *ehceProc;              // 图像增强功能
};
#endif // WIDGET_H
